#include<stdio.h>
#include<ctime>
#include<iostream>
#include"../detail.hpp"
#include<string>
#include"../message.hpp"
using namespace gchrpc;
// int main()
// {
//     std::time_t now=std::time(nullptr);
//     std::tm*local=std::localtime(&now);
//     std::cout
//     <<"NOW TIME:"<<"YEARS:"
//     <<1900+local->tm_year<<"MONTH:"
//     <<local->tm_mon+1<<"DAYS:"
//     <<local->tm_mday<<"HOURS:"
//     <<local->tm_hour<<"MINITER:"
//     <<local->tm_min<<"SECOND:"
//     <<local->tm_sec<<std::endl;
// }

// #define LOG(format,msg){\
//     time_t t=time(NULL);\
//     struct tm* lt=localtime(&t);\
//     char time_tmp[32]={0};\
//     strftime(time_tmp,31,"%m-%d %T",lt);\
//     printf("[%s][%s:%d]:" format "\n",time_tmp,__FILE__,__LINE__,msg);\
// }
// int main()
// {
//     printf("dasdasd" "dadasdasd""DASDASDAS");
//     LOG("%d",99);
//     return 0;
// }

// #define LOG(format,...){\
//     time_t t=time(NULL);\
//     struct tm* lt=localtime(&t);\
//     char time_tmp[32]={0};\
//     strftime(time_tmp,31,"%m-%d %T",lt);\
//     printf("[%s][%s:%d]:" format "\n",time_tmp,__FILE__,__LINE__,##__VA_ARGS__);\
// }
// int main()
// {
//     // printf("dasdasd" "dadasdasd""DASDASDAS");
//     // LOG("12545454");
//     // return 0;
//     // gchrpc::UUID UD;
//     // // gch::UUID UD;
//     // for(int i=0;i<10;i++)
//     // std::cout<<UD.uuid()<<std::endl;
//     Json::Value root;
//     root["甘初豪"]=55;
//     root["班级"]=16;
//     root["成绩"]=123;
//     JSON JS;
//     std::string str;
//     JS.serialize(root,str);
//     std::cout<<str<<std::endl;
//     Json::Value ret;

int main()
{
    // gchrpc::RpcRequest::ptr rrp=gchrpc::MessageFactory::create<gchrpc::RpcRequest>();
    // Json::Value params;
    // params["name"]="张三";
    // params["age"]=25;
    // // rrp->setMethod("add");
    // // rrp->setParams(params);
    // // std::string str=rrp->serialize();
    // // std::cout<<str<<std::endl;
    // // return 0;
    // // std::dynamic_pointer_cast<gchrpc::RpcRequest>(rrp)->setMethod("add");
    // gchrpc::RpcRequest::ptr rrp1=std::dynamic_pointer_cast<gchrpc::RpcRequest>(gchrpc::MessageFactory::create(gchrpc::MType::REQ_RPC));
    // rrp1->setMethod("add");
    // rrp1->setParams(params);
    // // std::string str1=rrp1->serialize();
    // std::cout<<rrp1->params()["age"].asInt()<<std::endl;
    // return 0;
    // gchrpc::TopicRequest::ptr trp1=std::dynamic_pointer_cast<gchrpc::TopicRequest>(gchrpc::MessageFactory::create(gchrpc::MType::REQ_TOPIC));
    // trp1->setTopicKey("test");
    // trp1->setOptype(gchrpc::TopicOptype::TOPIC_SUBSCRIBE);
    // trp1->setTopicMsg("hello world");
    // bool ret=trp1->check();
    // if(ret==false)
    // {   
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<trp1->serialize()<<std::endl;
    // gchrpc::TopicRequest::ptr trp2=std::dynamic_pointer_cast<gchrpc::TopicRequest>(gchrpc::MessageFactory::create(gchrpc::MType::REQ_TOPIC));
    // std::string str=trp1->serialize();
    // trp2->unserialize(str);
    // std::cout<<trp2->topicKey()<<std::endl;
    // std::cout<<(int)trp2->optype()<<std::endl;
    // std::cout<<trp2->topicMsg()<<std::endl;
    // return 0;

    // gchrpc::ServiceRequest::ptr svp1=std::dynamic_pointer_cast<gchrpc::ServiceRequest>(gchrpc::MessageFactory::create(gchrpc::MType::REQ_SERVICE));
    // svp1->setMethod("add");
    // svp1->setOptype(gchrpc::ServiceOptype::SERVICE_DISCOVERY);
    // // Json::Value params;
    // // params["name"]="张三";
    // // params["age"]=25;
    // Address addr;
    // addr.first="127.0.0.1";
    // addr.second=8080;
    // svp1->setHost(addr);
    // bool ret=svp1->check();
    // if(ret==false)
    // {        
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<svp1->serialize()<<std::endl;

    // gchrpc::RpcResponse::ptr rrp1=std::dynamic_pointer_cast<gchrpc::RpcResponse>(gchrpc::MessageFactory::create(gchrpc::MType::RSP_RPC));
    // rrp1->setResult("success");
    // rrp1->setRCode(Rcode::RCODE_OK);

    // bool ret=rrp1->check();
    // if(ret==false)
    // {
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<rrp1->serialize()<<std::endl;
    // return 0;
    
    // gchrpc::TopicResponse::ptr rrp1=std::dynamic_pointer_cast<gchrpc::TopicResponse>(gchrpc::MessageFactory::create(gchrpc::MType::RSP_TOPIC));
    // // rrp1->setResult("success");
    // rrp1->setRCode(Rcode::RCODE_OK);
    // bool ret=rrp1->check();
    // if(ret==false)
    // {
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<rrp1->serialize()<<std::endl;
    // return 0;

    // gchrpc::ServiceResponse::ptr rrp1=std::dynamic_pointer_cast<gchrpc::ServiceResponse>(gchrpc::MessageFactory::create(gchrpc::MType::RSP_SERVICE));
    // rrp1->setRCode(Rcode::RCODE_OK);
    // rrp1->setoptype(gchrpc::ServiceOptype::SERVICE_DISCOVERY);
    // rrp1->setMethod("add");
    // Address addr;
    // addr.first="127.0.0.1";
    // addr.second=8080;
    // Address addr1;
    // addr1.first="127.0.0.1";
    // addr1.second=8081;
    // std::vector<Address> addrs;
    // addrs.push_back(addr);
    // addrs.push_back(addr1);
    // rrp1->setHost(addrs);
    // bool ret=rrp1->check();
    // if(ret==false)
    // {
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // // std::cout<<rrp1->serialize()<<std::endl;
    // std::cout<<rrp1->serialize()<<std::endl;
    // std::cout<<(int)rrp1->rcode()<<std::endl;
    // std::cout<<rrp1->rid()<<std::endl;
    // std::cout<<rrp1->method()<<std::endl;
    // std::cout<<(int)rrp1->optype()<<std::endl;

    // std::vector<Address> addrs1=rrp1->hosts();
    // Address addr5=addrs1[1];
    // std::cout<<addr5.first<<":"<<addr5.second<<std::endl;
    // Address addr6=addrs1[0];
    // std::cout<<addr6.first<<":"<<addr6.second<<std::endl;

    // return 0;


    // std::vector<Address> addrs;
    // addrs.push_back(addr);
    // rrp1->setHost(addrs);
    // bool ret=rrp1->check();
    // if(ret==false)
    // {
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<rrp1->serialize()<<std::endl;
    // gchrpc::ServiceRequest::ptr rrp1=std::dynamic_pointer_cast<gchrpc::ServiceRequest>(gchrpc::MessageFactory::create(gchrpc::MType::REQ_SERVICE));

    // rrp1->setMethod("add");
    // rrp1->setOptype(gchrpc::ServiceOptype::SERVICE_DISCOVERY);
    // Address addr;
    // addr.first="127.0.0.1";
    // addr.second=8080;
    // rrp1->setHost(addr);
    // bool ret=rrp1->check();
    // if(ret==false)
    // {
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<rrp1->serialize()<<std::endl;

    // std::cout<<rrp1->method()<<std::endl;
    // std::cout<<(int)rrp1->optype()<<std::endl;
    // std::cout<<rrp1->host().first<<":"<<rrp1->host().second<<std::endl;
    // std::cout<<rrp1->rid()<<std::endl;
    // std::cout<<(int)rrp1->mtype()<<std::endl;
    // return 0;

    // gchrpc::TopicResponse::ptr rrp1=std::dynamic_pointer_cast<gchrpc::TopicResponse>(gchrpc::MessageFactory::create(gchrpc::MType::RSP_TOPIC));

    // rrp1->setRCode(gchrpc::Rcode::RCODE_OK);
    // // rrp1->setTopicKey("test");
    // // rrp1->setOptype(gchrpc::TopicOptype::TOPIC_SUBSCRIBE);
    // // rrp1->setTopicMsg("hello world");
    // bool ret=rrp1->check();
    // if(ret==false)
    // {
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<(int)rrp1->rcode()<<std::endl;
    // std::cout<<rrp1->serialize()<<std::endl;

    // gchrpc::TopicRequest::ptr rrp1=std::dynamic_pointer_cast<gchrpc::TopicRequest>(gchrpc::MessageFactory::create(gchrpc::MType::REQ_TOPIC));

    // rrp1->setTopicKey("test");
    // rrp1->setOptype(gchrpc::TopicOptype::TOPIC_SUBSCRIBE);
    // rrp1->setTopicMsg("hello world");
    // bool ret=rrp1->check();
    // if(ret==false)
    // {
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<rrp1->serialize()<<std::endl;

    // std::cout<<rrp1->topicKey()<<std::endl;
    // std::cout<<(int)rrp1->optype()<<std::endl;
    // std::cout<<rrp1->topicMsg()<<std::endl;

    // return 0;

    // gchrpc::RpcRequest::ptr rrp1=std::dynamic_pointer_cast<gchrpc::RpcRequest>(gchrpc::MessageFactory::create(gchrpc::MType::REQ_RPC));
    // rrp1->setMethod("add");
    // Json::Value params;
    // params["name"]="张三";
    // params["age"]=25;
    // rrp1->setParams(params);
    // bool ret=rrp1->check();

    // if(ret==false)
    // {
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<rrp1->serialize()<<std::endl;
    // std::cout<<rrp1->method()<<std::endl;
    // std::cout<<rrp1->params()["name"].asString()<<std::endl;
    // std::cout<<rrp1->params()["age"].asInt()<<std::endl;
    // return 0;

    // gchrpc::RpcResponse::ptr rrp1=std::dynamic_pointer_cast<gchrpc::RpcResponse>(gchrpc::MessageFactory::create(gchrpc::MType::RSP_RPC));
    // rrp1->setResult("success");
    // rrp1->setRCode(gchrpc::Rcode::RCODE_OK);
    // bool ret=rrp1->check();
    // if(ret==false)
    // {
    //     std::cout<<"check failed"<<std::endl;
    //     return 0;
    // }
    // else
    // {
    //     std::cout<<"check success"<<std::endl;
    // }
    // std::cout<<rrp1->serialize()<<std::endl;
    // std::cout<<(int)rrp1->rcode()<<std::endl;
    // std::cout<<rrp1->result()<<std::endl;
    // return 0;


}